// part1 模块二作业
// 一 运行结果输出10
//    for循环，var声明的i为全局变量，循环体内的函数声明内的语句不会被编译器预处理
//    因此，数组a内存的是相同形式的函数体，函数体只有在执行时才会访问变量，此时变量i已经增加到10
//    所以，a[6]（）的执行结果为10

// 二 运行报错，因为在执行上下文中，let不存在变量提升，所以变量未经声明就使用会报错

// 三
// var arr =[12,34,32,89,4]
// console.log(Math.min(...arr))

// 四
// var 声明的变量具有作用域内变量提升的功能，变量可以被重复声明
// let声明的变量只在{}块内，块外无法访问，不可重复声明，不具有声明提升，需先声明，后使用
// const声明的为常量，有块级作用域，常量在声明时必须赋值，且不可更改（引用值可修改属性）

// 五
// 输出20，因为setTimeout内使用的是箭头函数，箭头函数中this指向最近的函数的this，最近的函数this指向obj

// 六
// symbol类型可以为对象创建完全不同的属性名，可以解决命名冲突的问题，还可以私有化对象属性

// 七
// 浅拷贝：数据拷贝时，属性值为基本数据类型直接拷贝，引用类型则拷贝引用地址
// 深拷贝：遍历对象中所有属性值，基本类型直接拷贝，引用类型则再次遍历引用类型，获取内部的基本类型值

// 八
// typescript是javascript的超集，增加了类型系统，可以让js部分运行时报的错提前至开发阶段，提升编程的准确性。

// 九
// typescrip 优点：渐进式的，便于学习转换，功能强大。
//           缺点：有较多的概念，增加学习成本，短期项目成本高

// 十 引用计数算法
// 原理：通过引用计数器判断对象引用是否为零，
// 优点：垃圾及时回收；最大限度减少程序暂停
// 缺点：不能回收循环引用的对象；时间开销大

// 十一 标记整理
// 流程：1判断对象是否可达；2，将可达对象进行标记；3将可达对象进行移动整理；4清除不可达对象

// 十二 v8新生代存储区垃圾回收流程
// 流程：1将新生代分为两个相等的空间
//      2活动对象存储在from空间，to空间空闲
//      3from空间快满时，将from中活动对象复制到to空间
//      4交换to和from空间，释放旧from空间

// 十三 增量标记
//    使用时机：当回收耗时的垃圾内存时，为了不阻塞JavaScript的程序执行，就会使用征粮标记的垃圾回收机制
//    工作原理：将耗时的回收分成多个小段，使垃圾回收和程序执行可以交替运行，标记时可以分层标记（直接可达和间接可达分开标记）
